java是组合函数的最专业的方式
我正在学习Java课程,有一个关于专业性和效率的问题。我已经读到最好不要创建临时变量
我已正确回答其中一个测验问题,如下所示:
public void removeLowest(){
remove(find(lowScore())); //doesn't really read very easily
}
答案将每一步分解如下:
public void removeLowest(){
double low = lowScore();
int lowScoreIndex = find(low);
remove(lowScoreIndex);
}
两个版本完成相同的任务,但哪一个更好
谢谢
# 1 楼答案
这是一个很难回答的问题,因为两种观点都有自己的观点。然而,如果我们看一下每一个的字节码:
去除最低no中间产物
中间产物含量最低
所以你可以看到中间产物确实需要更多的操作和存储。然而,请记住JVM是智能的,所以在运行时它可能会对字节码进行优化。有可能的是,如果您多次调用它,它会将所有方法内联到同一个块中,并删除本地存储
就你的问题而言,我更倾向于可读性,而不是以易读性为代价编写更紧凑的代码。这纯粹是因为你的代码->;字节码->;在优化这段代码时会发生很多事情,所以您主要关心的是编写尽可能多的可维护代码。正如其他人所提到的,在更大的范围内,代表意义的几个中间存储值的成本非常低
# 2 楼答案
对于变量名直观的一小部分语句,即使是第一个代码示例也很好。在第二种情况下,代码更详细,更容易理解。(不说冗长==理解)
Efficiency
:至少在这种情况下,你不需要太担心它。Jim正确地指出,JVM比我们假设的更智能,可以根据需要进行优化。另外,只要把变量/对象放在正确的范围内,就不用太担心空间。(方法、类、实例)。请记住,当我们说java程序时,我们谈论的是managed code
,所以如果您支持1号以获得更高的效率,我会说它不会产生太大影响Professionalism
:第二个例子(作为实践演示者)更受欢迎,还有一个方面,maintainability
。类似的用法可能会出现。(*可维护性不仅取决于此) 有些语言不那么冗长,但仍然适用于大型代码库# 3 楼答案
就速度效率而言,两者是相同的。然而,第一种方法节省了一些内存,而不是分配内存来将返回的值存储在堆栈中。一般来说,在这种情况下,人们不必担心使用堆栈内存,原因有二。首先,堆栈是灵活的,可以存储大量的临时数据。第二,对于以后的代码审查,为函数的返回值指定一个名称,使代码对作者和其他修改代码的人更具可读性
# 4 楼答案
你说得对——他们都做同样的事! 但是,唯一的区别是,通过创建变量,还可以创建运行该方法的线程所拥有的LocalVariableReference。这引用了内部方法(例如getLow())返回的返回值。这意味着通过为返回值声明变量来命名返回值需要更多内存。 尽管如此,它使代码更容易阅读,而且老实说,占用的空间非常小,可以忽略! (这只是对一个值的引用——获取的数据非常小)
一句话:做一些对你来说更容易阅读和调试的事情